package com.wjw.java.map;

import java.util.Hashtable;
import java.util.Map;

/**
 * HashTable是Map接口的实现类,是线程安全的
 * ------------------------------------------------------------------
 * 1.HashTable存放的元素是键值对：K V
 * 2.HashTable的键和值都不能为Null
 * 3.HashTable使用方法同HashMap一样
 * 4.HashTable是线程安全的
 * ------------------------------------------------------------------
 * HashMap的底层是：数组+链表+红黑树
 * 数组：初始化后,默认大小为11
 * 链表：新增的每一个元素都是一个HashTable$Entry
 *       每一个Entry里面有属性next,指向下一个元素,从而形成链表
 * 红黑树：当一条链表上的元素>8,且table表的大小>=64,就会将该链表转为红黑树
 * ------------------------------------------------------------------
 * 扩容机制：
 * loadfactor(加载因子)初始化为0.75
 * 第一次添加时,table的默认大小为11,threshold(临界值)为11 * 0.75 = 8
 *   之后添加达到临界值,
 *   扩容table的大小为原来的2倍+1: 11*2+1 = 13,
 *   临界值也为原来的2倍+1: 8*2+1 = 17,依次类推
 */
public class Detail_HashTable {
    public static void main(String[] args) {
        Map<String,String> hashTable = new Hashtable<>();
        //hashTable.put(null,"aa");//NullPointerException
        //hashTable.put("aa",null);//NullPointerException
        //hashTable.put(null,null);//NullPointerException
        hashTable.put("001","张三");//OK
        hashTable.put("002","张三");//OK
        hashTable.put("李四","111");//OK
        hashTable.put("李四","222");//替换key相同的value
        System.out.println(hashTable);
    }
}
